<?php
App::uses('AppController', 'Controller');
/**
 * Matriculas Controller
 *
 * @property Matricula $Matricula
 * @property PaginatorComponent $Paginator
 * @property SessionComponent $Session
 */
class MatriculasController extends AppController {

/**
 * Components
 *
 * @var array
 */
	public $components = array('Paginator', 'Session', 'Utilities');
        public $uses = array('Matricula', 'Aluno', 'Turma', 'FormaPagamento', 'UnidadeEnsino', 'TurmaMatricula', 'FormaPagamentoMatricula');
        
/**
 * index method
 *
 * @return void
 */
	public function index() {
//		$this->Matricula->recursive = 3;
                $this->paginate = array('contain' => array('Aluno' => array('Pessoa'),
                                                           'TurmaMatricula' => array('Turma'=> array('UnidadeEnsinoCurso' => array('Curso')))),
                                        'order' => array('Pessoa.nome'));
                $matriculas = $this->Paginator->paginate();
                
                foreach ($matriculas as $chave => $valor){
                    $matriculas[$chave]['Matricula']['numero'] = str_pad($valor['Matricula']['numero'], 11, "0", STR_PAD_LEFT);
                }
                
		$this->set('matriculas', $matriculas);
	}

/**
 * view method
 *
 * @throws NotFoundException
 * @param string $id
 * @return void
 */
	public function view($id = null) {
		if (!$this->Matricula->exists($id)) {
			throw new NotFoundException(__('Matrícula inválida'));
		}
		$options = array('contain' => array('Aluno' => array('Pessoa'),
                                                    'FormaPagamentoMatricula' => array('FormaPagamento'),
                                                    'TurmaMatricula' => array('DisciplinaTurmaMatricula' => array('Disciplina'),
                                                                              'Turma')),
                                 'conditions' => array('Matricula.' . $this->Matricula->primaryKey => $id));
                
                $matricula = $this->Matricula->find('first', $options);
                $matricula['Matricula']['numero'] = str_pad($matricula['Matricula']['numero'], 11, "0", STR_PAD_LEFT);
                
                $valorTotal = 0;
                foreach ($matricula['TurmaMatricula'] as $turmaMatricula) {
                    foreach ($turmaMatricula['DisciplinaTurmaMatricula'] as $disciplinaTurmaMatricula) {
                        $valorTotal = $valorTotal + $disciplinaTurmaMatricula['valor'];
                    }
                }
                
                $totalGeral = $matricula['Matricula']['valor'] + $valorTotal;
                
                $valorTotalPagto = 0;
                foreach ($matricula['FormaPagamentoMatricula'] as $formaPagamentoMatricula) {
                    $valorTotalPagto = $valorTotalPagto + $formaPagamentoMatricula['valor'];
                }
                
		$this->set(compact('matricula', 'valorTotal', 'totalGeral', 'valorTotalPagto'));
	}

/**
 * add method
 *
 * @return void
 */
public function add() {
        if ($this->request->is('post')) {

            $this->Matricula->create();
            $dataSource = $this->Matricula->getDataSource();
            $dataSource->begin();

            $matriculaAnterior = $this->Matricula->find('first', array('fields' => array('max(Matricula.numero) as matricula')));

            if (empty($matriculaAnterior)) {
                $matricula = 1;
            } else {
                $matricula = $matriculaAnterior[0]['matricula'] + 1;
            }

            $this->request->data['Matricula']['numero'] = $matricula;
            $this->Utilities->formatarData($this->request->data['Matricula']['data']);
            $this->Utilities->formatarDecimal($this->request->data['Matricula']['valor']);
            
            foreach ($this->request->data['FormaPagamentoMatricula'] as $chave => $valor) {
                $this->Utilities->formatarDecimal($this->request->data['FormaPagamentoMatricula'][$chave]['valor']);

                if(empty($valor['parcelas'])){
                    unset($this->request->data['FormaPagamentoMatricula'][$chave]['parcelas']);
                }
                
                if (!empty($valor['valor_parcela'])) {
                    $this->Utilities->formatarDecimal($this->request->data['FormaPagamentoMatricula'][$chave]['valor_parcela']);
                }else{
                    unset($this->request->data['FormaPagamentoMatricula'][$chave]['valor_parcela']);
                }
            }

            $turmaMatricula['TurmaMatricula'] = $this->request->data['TurmaMatricula'];
            unset($this->request->data['TurmaMatricula']);
            unset($this->request->data['UnidadeEnsino']);
            unset($this->request->data['Curso']);
            unset($this->request->data['CursoDisciplina']);
            unset($this->request->data['Disciplina']);
            
            if ($this->Matricula->saveAll($this->request->data)) {
                
                $turmaMatriculaFormatada = array();
                
                foreach ($turmaMatricula['TurmaMatricula'] as $chave => $valor) {
                    
                    $this->Utilities->formatarDecimal($valor['DisciplinaTurmaMatricula']['valor']);
                    
                    if(array_key_exists($valor['turma_id'], $turmaMatriculaFormatada)){
                        $turmaMatriculaFormatada[$valor['turma_id']]['DisciplinaTurmaMatricula'][] = $valor['DisciplinaTurmaMatricula'];
                    }else{
                        $turmaMatriculaFormatada[$valor['turma_id']]['TurmaMatricula'] = $valor;
                        $turmaMatriculaFormatada[$valor['turma_id']]['TurmaMatricula']['matricula_id'] = $this->Matricula->id;
                        $turmaMatriculaFormatada[$valor['turma_id']]['DisciplinaTurmaMatricula'][] = $valor['DisciplinaTurmaMatricula'];
                        unset($turmaMatriculaFormatada[$valor['turma_id']]['TurmaMatricula']['DisciplinaTurmaMatricula']);
                    }
                }

                $sucesso = true;
                foreach($turmaMatriculaFormatada as $dados){
                    if(!$this->TurmaMatricula->saveAll($dados)){
                        $sucesso = false;
                    }
                }

                if ($sucesso) {
                    $dataSource->commit();
                    $this->Session->setFlash(__('Matrícula salva com sucesso.'));
                    return $this->redirect(array('action' => 'index'));
                } else {
                    $dataSource->rollback();
                    $this->Session->setFlash(__('A matrícula não pôde ser salva. Por favor, tente novamente.'));
                }
            } else {
                $dataSource->rollback();
                $this->Session->setFlash(__('A matrícula não pôde ser salva. Por favor, tente novamente.'));
            }
        }

        $alunos = $this->obterAlunos();
        $this->Utilities->adicionarItemChaveVazia($alunos, "--Selecione--");
        $unidadesEnsino = $this->UnidadeEnsino->find("list");
        $this->Utilities->adicionarItemChaveVazia($unidadesEnsino, "--Selecione--");
        $cursos = array("--Selecione--");
        $turmas = array("--Selecione--");
        $formasPagamento = $this->FormaPagamento->find('list', array('order' => array('FormaPagamento.descricao')));
        $this->Utilities->adicionarItemChaveVazia($formasPagamento, "--Selecione--");

        $this->set(compact('alunos', 'unidadesEnsino', 'cursos', 'turmas', 'formasPagamento'));
    }

/**
 * edit method
 *
 * @throws NotFoundException
 * @param string $id
 * @return void
 */
    public function edit($id = null) {
        if (!$this->Matricula->exists($id)) {
            throw new NotFoundException(__('Matrícula inválida'));
        }
        if ($this->request->is(array('post', 'put'))) {

            $dataSource = $this->Matricula->getDataSource();
            $dataSource->begin();
            
            $this->Utilities->formatarData($this->request->data['Matricula']['data']);
            $this->Utilities->formatarDecimal($this->request->data['Matricula']['valor']);
            
            $this->FormaPagamentoMatricula->recursive = -1;
            $formaPagamentoMatriculaBd = $this->FormaPagamentoMatricula->find('list', array('conditions' => array('matricula_id' => $id)));
            
            foreach ($this->request->data['FormaPagamentoMatricula'] as $chave => $valor) {
                if(!empty($valor['id']) && array_key_exists($valor['id'], $formaPagamentoMatriculaBd)){
                    unset($formaPagamentoMatriculaBd[$valor['id']]);
                }
                
                $this->Utilities->formatarDecimal($this->request->data['FormaPagamentoMatricula'][$chave]['valor']);
                
                if(empty($valor['parcelas'])){
                    unset($this->request->data['FormaPagamentoMatricula'][$chave]['parcelas']);
                }

                if (!empty($valor['valor_parcela'])) {
                    $this->Utilities->formatarDecimal($this->request->data['FormaPagamentoMatricula'][$chave]['valor_parcela']);
                }else{
                    unset($this->request->data['FormaPagamentoMatricula'][$chave]['valor_parcela']);
                }
            }
            
            $sucessoExclusaoFPM = $this->FormaPagamentoMatricula->deleteAll(array('FormaPagamentoMatricula.id' => $formaPagamentoMatriculaBd));

            $turmaMatricula['TurmaMatricula'] = $this->request->data['TurmaMatricula'];
            unset($this->request->data['TurmaMatricula']);
            unset($this->request->data['UnidadeEnsino']);
            unset($this->request->data['Curso']);
            unset($this->request->data['CursoDisciplina']);
            unset($this->request->data['Disciplina']);
            
            if ($sucessoExclusaoFPM && $this->Matricula->saveAll($this->request->data)) {
                
                $disciplinaturmaMatriculaBd = $this->TurmaMatricula->DisciplinaTurmaMatricula->find('list', array('contain' => array('TurmaMatricula' => array('conditions' => array('Turma.matricula_id' => $id)))));
                
                foreach($turmaMatricula['TurmaMatricula'] as $valorTM){
                    if(!empty($valorTM['DisciplinaTurmaMatricula']['id']) && array_key_exists($valorTM['DisciplinaTurmaMatricula']['id'], $disciplinaturmaMatriculaBd)){
                        unset($disciplinaturmaMatriculaBd[$valorTM['DisciplinaTurmaMatricula']['id']]);
                    }
                }
                
                $turmaMatriculaBd = $this->TurmaMatricula->find('all', array('contain' => array('DisciplinaTurmaMatricula' => array('conditions' => array('NOT' => array('DisciplinaTurmaMatricula.id' => $disciplinaturmaMatriculaBd)))),
                                                                             'conditions' => array('TurmaMatricula.matricula_id' => $id)));
                
                $turmaMatriculaExclusao = array();
                foreach($turmaMatriculaBd as $valor){
                    if(empty($valor['DisciplinaTurmaMatricula'])){
                        $turmaMatriculaExclusao[] = $valor['id'];
                    }
                }
                
                $sucessoExclusaoDTM = $this->TurmaMatricula->DisciplinaTurmaMatricula->deleteAll(array('DisciplinaTurmaMatricula.id' => $disciplinaturmaMatriculaBd));
                $sucessoExclusaoTM = $this->TurmaMatricula->deleteAll(array('TurmaMatricula.id' => $turmaMatriculaExclusao));
                
                $turmaMatriculaFormatada = array();
                
                foreach ($turmaMatricula['TurmaMatricula'] as $chave => $valor) {
                    
                    if(empty($valor['id'])){
                        $this->Utilities->formatarDecimal($valor['DisciplinaTurmaMatricula']['valor']);
                    }
                    
                    if(array_key_exists($valor['turma_id'], $turmaMatriculaFormatada)){
                        $turmaMatriculaFormatada[$valor['turma_id']]['DisciplinaTurmaMatricula'][] = $valor['DisciplinaTurmaMatricula'];
                    }else{
                        $turmaMatriculaFormatada[$valor['turma_id']]['TurmaMatricula'] = $valor;
                        $turmaMatriculaFormatada[$valor['turma_id']]['TurmaMatricula']['matricula_id'] = $this->Matricula->id;
                        $turmaMatriculaFormatada[$valor['turma_id']]['DisciplinaTurmaMatricula'][] = $valor['DisciplinaTurmaMatricula'];
                        unset($turmaMatriculaFormatada[$valor['turma_id']]['TurmaMatricula']['DisciplinaTurmaMatricula']);
                    }
                }

                $sucesso = true;
                foreach($turmaMatriculaFormatada as $dados){
                    if(!$this->TurmaMatricula->saveAll($dados)){
                        $sucesso = false;
                    }
                }
                
                if($sucessoExclusaoDTM && $sucessoExclusaoTM && $sucesso){
                    $dataSource->commit();
                    $this->Session->setFlash(__('Matrícula alterada com sucesso.'));
                    return $this->redirect(array('action' => 'index'));
                }else{
                    $dataSource->rollback();
                    $this->Session->setFlash(__('A matrícula não pôde ser alterada. Por favor, tente novamente.'));
                }
            } else {
                $dataSource->rollback();
                $this->Session->setFlash(__('A matrícula não pôde ser alterada. Por favor, tente novamente.'));
            }
        } else {
            $options = array('conditions' => array('Matricula.' . $this->Matricula->primaryKey => $id),
                'contain' => array('Aluno' => array('Pessoa'),
                    'FormaPagamentoMatricula' => array('FormaPagamento'),
                    'TurmaMatricula' => array('Turma',
                        'DisciplinaTurmaMatricula' => array('Disciplina'))));
            $this->request->data = $this->Matricula->find('first', $options);
        }

        $valorTotal = 0;
        foreach ($this->request->data['TurmaMatricula'] as $valorTM) {
            foreach ($valorTM['DisciplinaTurmaMatricula'] as $valorDTM) {
                $valorTotal = $valorTotal + $valorDTM['valor'];
            }
        }
        
        $valorTotalPagto = 0;
        foreach ($this->request->data['FormaPagamentoMatricula'] as $valor) {
            $valorTotalPagto = $valorTotalPagto + $valor['valor'];
        }
        
        $totalGeral = $this->request->data['Matricula']['valor'] + $valorTotal;

        $this->Utilities->formatarData($this->request->data['Matricula']['data'], false);
        $this->Utilities->formatarDecimal($this->request->data['Matricula']['valor'], false);
        $this->request->data['Matricula']['numero'] = str_pad($this->request->data['Matricula']['numero'], 11, "0", STR_PAD_LEFT);

        $alunos = $this->obterAlunos();
        $this->Utilities->adicionarItemChaveVazia($alunos, "--Selecione--");
        $unidadesEnsino = $this->UnidadeEnsino->find("list");
        $this->Utilities->adicionarItemChaveVazia($unidadesEnsino, "--Selecione--");
        $cursos = array("--Selecione--");
        $turmas = array("--Selecione--");
        $formasPagamento = $this->FormaPagamento->find('list', array('order' => array('FormaPagamento.descricao')));
        $this->Utilities->adicionarItemChaveVazia($formasPagamento, "--Selecione--");

        $this->set(compact('valorTotal', 'totalGeral', 'valorTotalPagto', 'alunos', 'unidadesEnsino', 'cursos', 'turmas', 'formasPagamento'));

    }

/**
 * delete method
 *
 * @throws NotFoundException
 * @param string $id
 * @return void
 */
	public function delete($id = null) {
		$this->Matricula->id = $id;
		if (!$this->Matricula->exists()) {
			throw new NotFoundException(__('Matrícula inválida'));
		}
		$this->request->allowMethod('post', 'delete');
		if ($this->Matricula->delete()) {
			$this->Session->setFlash(__('Matrícula excluída com sucesso.'));
		} else {
			$this->Session->setFlash(__('A matrícula não pôde ser excluída. Por favor, tente novamente.'));
		}
		return $this->redirect(array('action' => 'index'));
	}
        
        private function obterAlunos(){
            $alunosBd = $this->Aluno->find('all', array('fields' => array('Aluno.id', 'Pessoa.nome'),
                                                        'contain' => array('Pessoa'),
                                                        'conditions' => array('Aluno.ativo' => 'S')));
                
            $alunos = array();
            foreach($alunosBd as $valor){
                $alunos[$valor['Aluno']['id']] = $valor['Pessoa']['nome'];
            }
            
            return $alunos;
        }
}
